package com.tiancheng.trade.merchant.channel;

import com.tiancheng.trade.commom.core.data.ApplicationInfo;
import com.tiancheng.trade.commom.core.enums.MerchantRegStatusEnums;
import com.tiancheng.trade.commom.web.model.request.merchant.MerchantBranchBankListReqVO;
import com.tiancheng.trade.commom.web.model.response.MerchantBranchBankListResVO;
import com.tiancheng.trade.merchant.channel.bo.MerchantRegSmsSendBO;
import com.tiancheng.trade.merchant.channel.bo.MerchantRegSmsVerifyBO;
import com.tiancheng.trade.merchant.channel.handler.ums.request.UmsMerchantReqAgreementSignRequest;
import com.tiancheng.trade.merchant.channel.handler.ums.request.UmsMerchantReqCompanyAccountVerifyRequest;
import com.tiancheng.trade.merchant.channel.handler.ums.request.UmsMerchantReqRequestAccountVerifyRequest;
import com.tiancheng.trade.merchant.channel.handler.ums.request.UmsMerchantReqStatusQueryRequest;
import com.tiancheng.trade.merchant.dto.message.ChannelNotifyMessage;
import com.tiancheng.trade.merchant.dto.requestdto.MerchantPayRegVO;
import com.tiancheng.trade.merchant.dto.requestdto.MinioUploadDto;
import com.tiancheng.trade.merchant.dto.responsedto.MerchantRegStatusQueryResDTO;
import com.tiancheng.trade.merchant.enums.MerchantTypeEnums;
import com.tiancheng.trade.merchant.model.MerchantPayReg;
import com.tiancheng.trade.merchant.model.MerchantPayRegFile;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 支付渠道抽象类
 *
 * @author kellen
 * @date 2024/4/15
 */
public interface AbstractMerchantRegChannel {
    /**
     *
     * @param file
     * @param regMode 进件模式：0-人工进件，1-自助进件
     * @param upload 交易中台上传结果
     * @return
     */
    MerchantPayRegFile upload(MultipartFile file, Integer regMode, MinioUploadDto upload);

    /**
     * 提交进件资料
     * @param merchantPayRegVO
     */
    MerchantPayReg complexUpload(ApplicationInfo application,MerchantPayRegVO merchantPayRegVO);

    /**
     * 查询银行列表
     * @param merchantBranchBankListReqVO
     * @return
     */
    List<MerchantBranchBankListResVO> branchBankList(MerchantBranchBankListReqVO merchantBranchBankListReqVO);

    /**
     * 省市区行业数据下载
     * @return
     */
    String queryRegin(String dataType);

    /**
     *  起对公账户验证交易接口
     * @param param
     */
    void requestAccountVerify(UmsMerchantReqRequestAccountVerifyRequest param);

    /**
     * 对公账户认证接口
     * @param companyAccountVerifyRequest
     */
    void companyAccountVerify(UmsMerchantReqCompanyAccountVerifyRequest companyAccountVerifyRequest);

    /**
     * 发送短信验证码
     */
    void smsSend(MerchantRegSmsSendBO merchantRegSmsSendBO);

    /**
     * 短信验证码验证
     * @param merchantRegSmsVerifyBO
     */
    void smsVerify(MerchantRegSmsVerifyBO merchantRegSmsVerifyBO);

    /**
     * 3.3  前台签约接口
     *
     * @param agreementSignRequest
     * @return
     */
    String agreementSign(UmsMerchantReqAgreementSignRequest agreementSignRequest);

    /**
     * 银联商户进件状态查询
     * @param request
     * @return
     */
    MerchantRegStatusQueryResDTO queryRegisterStatus(UmsMerchantReqStatusQueryRequest request);

    MerchantRegStatusEnums nextFlow(MerchantRegStatusEnums currentFlow, MerchantTypeEnums merchantType);

    /**
     * 是否需要签约
     */
    boolean needSign();

    /**
     * 支付通道消息解密<br></br
     * 消息解密以及转换
     */
    ChannelNotifyMessage callbackMsg(Map<String, Object> paramsMap);
}

